#pragma once

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

// 命名管道
// 1.先让两个进程看到同一份资源 -- mkfifo创建命名管道文件
// 2.让client端往fifo里写，同时server端可以看见
// 3.关掉通道

// mkfifo先要指定路径
const std::string gpathFile = "./fifo";
//const std::string gpathFile = "/home/shz/112/mylesson24/fifo";

// 还要有权限
mode_t gmode = 0666;

// 标识符
const int gForWrite = O_WRONLY;
const int gForRead = O_RDONLY;

int gsize = 1024;
const int gdefultfd = -1;

int OpenPipe(int flag)
{
    int fd = ::open(gpathFile.c_str(), flag, gmode);
    if (fd < 0)
    {
        std::cerr << "open error" << std::endl;
    }

    return fd;
}

void CloseHelper(int fd)
{
    if (fd > 0)
        ::close(fd);
}



// 两端是怎么联系起来的 -- 靠的是fifo的的内核缓冲区
// 写端拿到fifo的文件描述符找到其内核缓冲区，往里写
// 读端拿到fifo的文件描述符找到其内核缓冲区，从里读
// task_struct -> file_struct（fd_array） -> struct file -> struct inode -> 文件缓冲区